import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectTest {
    public static void main(String[] args) throws Exception {
        //获取类
        Class c1 = Class.forName("adc.ad.top.me.Student");
        Object o = c1.newInstance();
        //Field属性类测试
            //怎么获取Field对象？

        Field[] filed = c1.getDeclaredFields();
        Field.setAccessible(filed,true);//打破封装
            //Field.setAccessible(filed,true);
        System.out.println(filed.length);
            //访问？
        for (Field e : filed) {
            System.out.println(e.getName());
        }
        Field addressField = filed[2];//
        System.out.println(addressField.getName());

        addressField.set(o,"aaa");
        System.out.println(addressField.get(o));
            //获取属性类型
        System.out.println("属性类型："+addressField.getType().getSimpleName());
                //分开写
        Class typeClass = addressField.getType();//返回这条属性的类型这个返回值是个Class类型
        String className = typeClass.getSimpleName();//获取类的简化名
        System.out.println("属性类型："+className);
            //获取修饰符
        int c11 = addressField.getModifiers();
        System.out.println("属性" +addressField.getName() + "的修饰符是" + Modifier.toString(c11));
            //通过类中的属性的名称来获取一个属性类对象
        Field f = c1.getField("name");
        System.out.println("通过类中的属性的名称来获取一个属性类对象:" + f.getName());
        //Method类测试
            //获取方法名
                //与Field类似
        Method [] arr2 = c1.getDeclaredMethods();
        for (Method method : arr2) {
            System.out.println(method.getName());
        }
            //调用方法
        Method loadMethod = arr2[0];//获取Student中的load方法的对象
        loadMethod.invoke(o,5,"aaa",true);//调用
            //获取返回值类型
        System.out.println("返回值类型："+loadMethod.getReturnType().getSimpleName());
            //通过方法的名称和参数列表来确定一个方法类对象
                //注意该方法的参数列表都是Class，可通过 参数类型.class获得 然后按照顺序一个一个写
        Method m = c1.getMethod("load",int.class,String.class,boolean.class);

        System.out.println(m.getName());
            //获取修饰符
        String str = Modifier.toString(m.getModifiers());
        System.out.println("学生类型中的修饰符为：" + str);














    }
}
